<?php
/**
 * Created by PhpStorm.
 * User: tsy
 * Date: 2017/2/16
 * Time: 10:24
 */

/*
 * 生成压缩包文件名
 * @param [String] $orderNum 订单号
 * @return [String] 返回带有绝对路径的订单号的压缩文件名
 */
define('SYS_ROOT', str_replace("\\", '/', dirname(__FILE__)));
//define('SYS_UPLOAD', '/opt/redmine-3.2.0-1/apache2/htdocs/Public/Upload/UploadAudit');//测试
//define('SYS_DOWNLOAD', '/opt/redmine-3.2.0-1/apache2/htdocs/Public/Upload/UploadReport');
define('SYS_UPLOAD', '/var/www/html/Public/Upload/UploadAudit');//测试
define('SYS_DOWNLOAD', '/var/www/html/Public/Upload/UploadReport');
define('SYS_DOMAIN','http://icon.bypal.cn/Upload/UploadAudit');
define('SYS_WIN', strpos(strtoupper(PHP_OS), 'WIN') !== false ? true: false);
define('SYS_CHMOD', ('0777' && !SYS_WIN) ? '0777' : 0);


function get_zipname($orderNum) {
    $zipName = SYS_DOWNLOAD . '/' . $orderNum . '.zip';
    return $zipName;
}

/*
 * 按照特定需求打包压缩包的目录结构设置
 */

function pack_object() {

}

/*
 * 生成压缩包
 * @param [Array] $arrfiles 带有绝对路径的文件数组
 * @param [String] $orderNum 订单号
 * @return [String] 返回带有绝对路径的订单号的压缩文件名 如如果失败返回 FALSE
 */

function create_zip($arrfiles, $orderNum) {
    $zipName = get_zipname($orderNum); //获得文件名
    dir_create(dirname($zipName)); //建立生成压缩文件的目录
    $zip = new ZipArchive();
    if ($zip->open($zipName, ZIPARCHIVE::CREATE) !== TRUE) {
        return FALSE;
    }
    foreach ($arrfiles as $path) {
        if (is_file($path)) {//判断文件是否存在
            $zip->addFile($path, basename($path)); //把文件加入到压缩包中
        }
    }
    $zip->close();
    return $zipName;
}

/*
 * 处理文件目录
 * @param [Array] $arrfiles 带有绝对路径的文件数组
 * @param [String] $dirpath 文件路径
 * @return [String] 返回处理的文件路径，方便生成文件目录
 */

function dir_path($dirpath) {
    $dirpath = str_replace('\\', '/', $dirpath);
    if (substr($dirpath, -1) != '/')
        $dirpath = $dirpath . '/';
    return $dirpath;
}

/*
 * 生成文件目录
 * @param [String] $path 文件路径
 * @return [String] 返回生成的文件目录结构
 */

function dir_create($path) {
    if (is_dir($path))
        return true;
    $dir = str_replace(SYS_DOWNLOAD . '/', '', $path);
    $dir = dir_path($dir);
    $temp = explode('/', $dir);
    $cur_dir = SYS_DOWNLOAD . '/';
    $max = count($temp) - 1;
    for ($i = 0; $i < $max; $i++) {
        $cur_dir .= $temp[$i] . '/';
        if (is_dir($cur_dir))
            continue;
        @mkdir($cur_dir);
        if (SYS_CHMOD)
            @chmod($cur_dir, SYS_CHMOD);
        if (!is_file($cur_dir . '/index.html') && !is_file($cur_dir . '/index.php'))
            file_copy(SYS_ROOT . '/upload/index.html', $cur_dir . '/index.html');
    }

    return is_dir($path);
}

/*
 * 文件COPY
 * @param [String] $from copy源文件
 * @param [String] $to copy文件目的地
 * @return [Bool] 成功 ture 失败 false
 */

function file_copy($from, $to) {
    dir_create(dirname($to));
    if (is_file($to) && SYS_CHMOD)
        @chmod($to, SYS_CHMOD);
    if (@copy($from, $to)) {
        if (SYS_CHMOD)
            @chmod($to, SYS_CHMOD);
        return true;
    } else {
        return false;
    }
}

/*
 * 文件下载处理函数
 * @param [String] $file 文件路径
 * @param [String] $filename 下载时间重新命名的文件名
 * @param [String] $data 下载文件填装的数据内容
 */

function file_down($file, $filename = '', $data = '') {
    if (!$data && !is_file($file))
        exit;
    $filename = $filename ? $filename : basename($file);
    $filetype = file_ext($filename);
    $filesize = $data ? strlen($data) : filesize($file);
    ob_end_clean();
    @set_time_limit(0);
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
    } else {
        header('Pragma: no-cache');
    }
    header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
    header('Content-Encoding: none');
    header('Content-Length: ' . $filesize);
    header('Content-Disposition: attachment; filename=' . $filename);
    header('Content-Type: ' . $filetype);
    if ($data) {
        echo $data;
    } else {
        readfile($file);
    }
    exit;
}

function file_ext($filename) {
    return strtolower(trim(substr(strrchr($filename, '.'), 1)));
}

//此函数未用到，用来做整个目录的打包下载
function listdir($start_dir = '.') {
    $files = array();
    if (is_dir($start_dir)) {
        $fh = opendir($start_dir);
        while (($file = readdir($fh)) !== false) {
            if (strcmp($file, '.') == 0 || strcmp($file, '..') == 0)
                continue;
            $filepath = $start_dir . '/' . $file;
            if (is_dir($filepath))
                $files = array_merge($files, listdir($filepath));
            else
                array_push($files, $filepath);
        }
        closedir($fh);
    } else {
        $files = false;
    }
    return $files;
}